Redigoを使う(5) ユーティリティ関数
はじめに
我們來看看專為Go語言設計的客戶端庫Redigo的使用方法。Redigo提供了許多實用的工具函數,方便簡潔的編程。我們將介紹其中一些主要的使用方法。
环境
-
- OS: Windows 10
-
- Redis: win-3.2.100
Go言語: 1.11
変数へ変換
サーバからの応答をGoの様々な型に変換する関数です。
整数型に変換するにはIntやInt64やUint64を用います。例えばRedisの文字列型で保存した数値をGETでとるときや、LLENなどの応答に使います。また、浮動小数点型に変換するにはFloat64、文字列型に変換するにはString、バイトスライスに変換するにはBytesを使います。
var n int
_, _ = conn.Do("SET", "money", "1000")
n, _ = redis.Int(conn.Do("GET", "money"))
fmt.Println(n) // 1000
_, _ = conn.Do("RPUSH", "city", "tokyo")
n, _ = redis.Int(conn.Do("LLEN", "city"))
fmt.Println(n) // 1
var f float64
_, _ = conn.Do("SET", "temperature", "25.6")
f, _ = redis.Float64(conn.Do("GET", "temperature"))
fmt.Println(f) // 25.6
var s string
_, _ = conn.Do("SET", "weather", "rainy")
s, _ = redis.String(conn.Do("GET", "weather"))
fmt.Println(s) // rainy
var b []byte
_, _ = conn.Do("SET", "alphabet", "abc")
b, _ = redis.Bytes(conn.Do("GET", "alphabet"))
fmt.Println(b) // [97 98 99]
将其转换为切片
将来自Redis服务器的多个回复(多块回复)转换为切片。 如果要将它们全部转换为相同的类型,可以使用Ints、Float64s、Strings、ByteSlices等。 如果Ints或Float64s中有任何一个类型转换失败,将返回错误。
var n []int
_, _ = conn.Do("MSET", "width", "640", "height", "480")
n, err = redis.Ints(conn.Do("MGET", "width", "height"))
fmt.Println(n) // [640 480]
var f []float64
_, _ = conn.Do("MSET", "temperature", "25.6", "humidity", "10.3")
f, _ = redis.Float64s(conn.Do("MGET", "temperature", "humidity"))
fmt.Println(f) // [25.6 10.3]
var s []string
_, _ = conn.Do("RPUSH", "city", "tokyo")
_, _ = conn.Do("RPUSH", "city", "osaka")
s, _ = redis.Strings(conn.Do("LRANGE", "city", 0, -1))
fmt.Println(s) // [tokyo osaka]
var b [][]byte
_, _ = conn.Do("RPUSH", "alphabet", "abc")
_, _ = conn.Do("RPUSH", "alphabet", "def")
b, _ = redis.ByteSlices(conn.Do("LRANGE", "alphabet", 0, -1))
fmt.Println(b) // [[97 98 99] [100 101 102]]
当不同类型混合存在时,可以将其转换为interface{}切片以通过Values进行转换。而要进行批量转换,则可以使用Scan函数来实现方便。
var weight int
var eyesight float64
var blood string
var v []interface{}
_, _ = conn.Do("SET", "weight", "60")
_, _ = conn.Do("SET", "eyesight", "1.5")
_, _ = conn.Do("SET", "blood", "A")
v, _ = redis.Values(conn.Do("MGET", "weight", "eyesight", "blood"))
v, _ = redis.Scan(v, &weight, &eyesight, &blood)
fmt.Println(weight, eyesight, blood) // 60 1.5 A
将其转换为地图
在HGETALL(获取哈希类型的所有字段名和对应的值对)的响应中,字段名和值会交替出现。还提供了将其转换为映射的函数。
var m map[string]string
_, _ = conn.Do("HSET", "profile", "name", "yamada")
_, _ = conn.Do("HSET", "profile", "age", "30")
_, _ = conn.Do("HSET", "profile", "country", "america")
m, _ = redis.StringMap(conn.Do("HGETALL", "profile"))
fmt.Println(m) // map[name:yamada age:30 country:america]
var p map[string]int
_, _ = conn.Do("HSET", "cpu", "sys", "10")
_, _ = conn.Do("HSET", "cpu", "usr", "20")
_, _ = conn.Do("HSET", "cpu", "wai", "30")
p, _ = redis.IntMap(conn.Do("HGETALL", "cpu"))
fmt.Println(p) // map[usr:20 wai:30 sys:10]
转换为结构体
可以将HGETALL的结果转换为结构体。可以在结构体的定义中使用”redis”标签指定字段名,并将获取的结果Values传递给ScanStruct。
var v []interface{}
var p struct {
Name string `redis:"name"`
Age int `redis:"age"`
Country string `redis:"country"`
}
_, _ = conn.Do("HSET", "profile", "name", "yamada")
_, _ = conn.Do("HSET", "profile", "age", "30")
_, _ = conn.Do("HSET", "profile", "country", "america")
v, _ = redis.Values(conn.Do("HGETALL", "profile"))
_ = redis.ScanStruct(v, &p)
fmt.Println(p) // {yamada 30 america}
结尾处
我看到了Redigo中各种实用函数的用法。
请参考
-
- Redigoを使う(1) 基本的な使い方
-
- Redigoを使う(2) 様々なデータ型を扱う
-
- Redigoを使う(3) トランザクションを行う
-
- Redigoを使う(4) コネクションプールを使う
- Redigoを使う(6) パブリッシュ/サブスクライブ